ヘッダーをスキップ
Oracle TimesTen In-Memory Database Java開発者およびリファレンス・ガイド
リリース6.0
B25766-01
  目次へ
目次
索引へ
索引

前へ
前へ
次へ
次へ
 

更新の受信および処理

XLA更新は、非同期または同期をとって受信できます。トピックの更新を同期をとって受信および処理するには、次の手順を実行します。

  1. 永続TopicSubscriberを作成してトピックをサブスクライブします。
  2. サブスクライバでreceiveまたはreceiveNoWaitをコールして、次に使用可能な更新を取得します。
  3. 返されたMapMessageを処理します。

トピックの更新を非同期に受信および処理するには、次の手順を実行します。

  1. 更新を処理するMessageListenerを作成します。
  2. 永続TopicSubscriberを作成してトピックをサブスクライブします。
  3. TopicSubscriberにMessageListenerを登録します。
  4. メッセージを受信するまで待機します。アプリケーションがメイン・スレッド内で行う処理が他にない場合は、Object.waitをコールしてメッセージを待機できます。
  5. 更新がパブリッシュされると、MessageListener onMessageメソッドがコールされ、メッセージがMapMessageとして渡されます。

    たとえば、XlaLevel1デモは、リスナーを使用して更新を非同期に処理します。例3.4を参照してください。

例3.4
MyListener myListener = new MyListener(outStream); 
outStream.println("Creating consumer for topic " + topic); 
Topic xlaTopic = session.createTopic(topic); 
TopicSubscriber subscriber =
 session.createDurableSubscriber(xlaTopic, "mybookmark"); 
subscriber.setMessageListener(myListener); 
 

TopicSubscriberは、永続サブスクライバである必要があります。XLA接続は永続的であるように設計されています。XLAブックマークによって、トピックからの切断が可能になり、更新が中断した位置から更新の受信を開始するために、再度接続することもできます。永続サブスクライバの作成時にサブスクリプション識別子として渡すStringは、XLAブックマーク名として使用されます。

アプリケーションの停止時にJMS TopicSessionからのサブスクライブ解除をコールして、そのサブスクライバで使用したXLAブックマークを削除できます。これによって、アプリケーションの再起動時に、新しいブックマークが作成されます。

更新の処理

更新を受信すると、MapMessage取得メソッドを使用してメッセージから情報を抽出し、アプリケーションで必要な処理を行うことができます。TimesTen XlaConstants.javaクラスでは、XLA更新メッセージの処理を簡単にするために、更新タイプおよび特別なメッセージ・フィールドの定数が定義されています。

通常、メッセージに含める更新タイプを最初に決定します。MapMessage.getIntメソッドを使用して__TYPEフィールドの内容を取得し、XlaConstantsクラスで定義されている数値定数とその値を比較します。

XlaLevel1デモでは、MySubscriberのonMessageメソッドはMapMessageから更新タイプを抽出し、更新が示している処理を表示します。例3.5を参照してください。

例3.5
public void onMessage(Message message) { 
      MapMessage mapMessage = (MapMessage) message; 
      String messageType = null; 
      if (message == null) { 
        errStream.println("MyListener: update message is null"); 
        return; 
      } 
      try { 
        // Get the update type(insert, update, delete, etc.). 
        int type = mapMessage.getInt(XlaConstants.TYPE_FIELD); 
        if (type == XlaConstants.INSERT) { 
          System.out.println("A row was inserted."); 
        } else if (type == XlaConstants.UPDATE) { 
          System.out.println("A row was updated."); 
        } else if (type == XlaConstants.DELETE) { 
          System.out.println("A row was deleted."); 
        } else { 
          return; 
        } 
 

受信したメッセージのタイプがわかれば、アプリケーションにおける必要性に応じて、メッセージを処理できます。メッセージのすべてのフィールドのリストを取得するには、MapMessage.getMapNamesをコールします。メッセージの個々のフィールドを名前ごとに取得できます。

たとえば、XlaLevel1デモでは、列名を使用して、挿入、更新および削除メッセージから列値を抽出します。例3.6を参照してください。

例3.6
if (type == XlaConstants.INSERT
 || type == XlaConstants.UPDATE 
 || type == XlaConstants.DELETE) { 
          // Get the column values from the message. 
          int cust_num = mapMessage.getInt("cust_num"); 
          String region = mapMessage.getString("region"); 
          String name = mapMessage.getString("name"); 
          String address = mapMessage.getString("address"); 
   
          System.out.println("New Column Values:"); 
          System.out.println("cust_num=" + cust_num); 
          System.out.println("region=" + region); 
          System.out.println("name=" + name); 
          System.out.println("address=" + address); 
        } 
 

XLA更新メッセージの内容の詳細は、「XLA MapMessageの内容」を参照してください。 また、TimesTenの列の型がどのようにJMSデータ型にマップされているか、および列値を取得するために使用する取得メソッドについては、「データ型のマッピング」を参照してください。